// Copyright 2022 jeff.li. and/or its affiliates.

#pragma once

// clang-format off
#include <turbo/json/document.h>
#include <tbir/runtime/logging.h>

#ifndef RAPIDJSON_ASSERT
#define RAPIDJSON_ASSERT(x) CHECK(x)
#endif

#include <tbir/runtime/runtime_value.h>
#include <tbir/runtime/container.h>
// clang-format on

namespace tbir::runtime::pickle {

    /******************************************************************************
     * utf-8 json, no node info
     *****************************************************************************/
    TURBO_EXPORT RTValue FromJson(const rapidjson::Value &val, bool use_unicode = false);

    TURBO_EXPORT void ToJson(const Any &value,
                         rapidjson::Value &json_val,
                         rapidjson::MemoryPoolAllocator<> &allocator);

    TURBO_EXPORT inline rapidjson::Document ToJson(const Any &value) {
        rapidjson::Document doc;
        ToJson(value, doc, doc.GetAllocator());
        return doc;
    }

    /******************************************************************************
     * every node is like this:
     * {
     *    "t": "str",
     *    "v": "abc",
     * }
     *****************************************************************************/
    // user_code is only valid for opaque handle
    TURBO_EXPORT RTValue FromJsonStruct(const rapidjson::Value &val);

    TURBO_EXPORT void ToJsonStruct(const Any &value,
                               rapidjson::Value &json_val,
                               rapidjson::MemoryPoolAllocator<> &allocator);

    TURBO_EXPORT inline rapidjson::Document ToJsonStruct(const Any &value) {
        rapidjson::Document doc;
        ToJsonStruct(value, doc, doc.GetAllocator());
        return doc;
    }

    TURBO_EXPORT String Serialize(const Any &value);

    TURBO_EXPORT RTValue DeSerialize(const string_view &str);

}  // namespace tbir::runtime::pickle
